package com.shanyin.framework.common.util;

import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Map;

/***
 ** @category 请用一句话来描述其用途...
 ** @author qing.yunhui
 ** @email: 280672161@qq.com
 ** @createTime: 2018年5月23日上午9:24:05
 **/
public class StringUtil{

	/**
	 * <p>判断给定的对象是否为null或空</p>
	 * @param obj 待校验的对象
	 * @return boolean
	 * */
	@SuppressWarnings("rawtypes")
	public static boolean isEmptys(Object obj){
		if(null==obj)return true;
		if(obj instanceof Map){
			return ((Map)obj).isEmpty();
		}else if(obj instanceof Collection){
			return ((Collection)obj).isEmpty();
		}
		else if(obj instanceof String){
			if(((String)obj).trim().length()==0)return true;
			if("[]".equals(obj))return true;
		}else if(obj.getClass().isArray()){
			return Array.getLength(obj)==0;
		}else{
			return false;
		}
		return false;
	}
    
	/**
	 * <p>判断给定的对象判断是否为null或空</p>
	 * @param objects 待校验的对象
	 * @return  boolean
	 * */
	public static boolean isEmptys(Object...objects){
		if(null==objects || objects.length<1)return true;
		for(Object obj:objects){
			boolean isEmpty=isEmptys(obj);
			if(isEmpty) return true;
		}
		return false;
	}
	
	/**
	 * <p>判断给定的字符判断是否为null或空</p>
	 * @param objects
	 * @return  boolean
	 * */
	public static boolean isNotEmptys(Object ...objects){
		return !isEmptys(objects);
	}
	
	 /**
	  * <p>把str剪切不超过count个长度;</p>
	  * @param str 待剪切的字符
	  * @param count 剪切字符的最大长度;
	  * @param positive 截取的顺序(true:从头往后截取,false:从末尾往前截取)
	  * @return 剪切后的字符串
	  * ***/
	 public static String truncate(String str,int count,boolean positive){
		 if(null==str) return null;
		 char[] charArray=null;
		 StringBuffer sbufer=new StringBuffer(str);
		 charArray=positive?sbufer.toString().toCharArray():sbufer.reverse().toString().toCharArray();
		 int len=charArray.length;
		 for(int i=0;i<count && i<len;i++){
			 if(charArray[i]>0XFF){
				 count--;
			 }
		 }
		 count=count>0 ?count:0;
		 int currCount=count<len?count:len;
		 String strData=sbufer.toString();
		 String tmp=strData.substring(0,currCount);
		 if(positive) return tmp;
		 sbufer.setLength(0);
		 return sbufer.append(tmp).reverse().toString();
	 }
	 
	 /***
	 * 首字母转换
	 * @param str 待转换的字符
	 * @param isUpper true:首字母转换大写 , false:首字母转换小写
	 * @return 转换后的字符
	 * **/
	public static String firstLetterConvert(String str,boolean isUpper) {
		StringBuffer buff = new StringBuffer(str);
		buff.replace(0, 1, String.valueOf(isUpper?Character.toUpperCase(str.charAt(0)):Character.toLowerCase(str.charAt(0))));
		return buff.toString();
	}
	
	/***
	 * <p>根据给定field进行转换成数据库表字段</p>
	 * <p>java实体字段->数据表字段的转换(比如userName转换后user_name)</p>
	 * @param field 待转换的字段
	 * @return String 转换后的字段
	 * **/
	public static String getFieldName(String field){
		if(isEmptys(field))return null;
		/*小写字母a-z 对应数字97-122 , 大写字母A-Z对应数字65-90*/
		char[] chars=field.toCharArray();
		StringBuffer sb=new StringBuffer();
		for(int i=0;i<chars.length;i++){
			if(i==0){
				sb.append(chars[i]);
				continue;
			}
			if((int)chars[i]>=65 && chars[i]<=90){
				sb.append("_").append(chars[i]);
			}else{
				sb.append(chars[i]);
			}
		}
		return sb.toString().toLowerCase();
	}
	
	/***
	 * <p>根据给定field进行转换成数据库表字段</p>
	 * <p>java实体字段->数据表字段的转换(比如userName转换后user_name)</p>
	 * @param entity 待转换的字段
	 * @return String 转换后的字段
	 * **/
	public static String getFieldName(Class<?> entity){
		return getFieldName(entity.getSimpleName());
	}
	
	public static void main(String[]ARGS) {
	}
	
}
